import java.util.Random;
import java.util.Arrays;
import java.lang.Math;
import java.io.*;

public class Fig1
{
    public static void main(String[] args) throws Exception
    {
	Fig1 f = new Fig1();
	int n = 20;
	if (args.length > 0)
	    n = Integer.parseInt(args[0]);
	f.run(n);
    }

    public void run(int n) throws Exception
    {
	Random r = new Random();
	BufferedWriter b1 = new BufferedWriter(new FileWriter("cdf.dat"));
	for (double x = -2.0; x <= 2.0; x += 0.01) 
	    b1.write(x + "\t" + cdfNormal(x, 0, 1) + "\n");
	b1.close();

	BufferedWriter b2 = new BufferedWriter(new FileWriter("ecdf.dat"));
	for (double x = -2.0; x <= 2.0; x += 4.0/n)
	    b2.write(x + "\t" + cdfNormal(x, 1, 1) + "\n");
	b2.close();
    }

    // the cdf of N(mu, sigma) on value x
    public static double cdfNormal(double x, double mu, double sigma)
    {
	return 0.5 + 0.5 * erf((x - mu)/(sigma * Math.sqrt(2.0)));
    }

    // erf function taken from:
    // http://introcs.cs.princeton.edu/java/21function/ErrorFunction.java.html
    // fractional error in math formula less than 1.2 * 10 ^ -7.
    // although subject to catastrophic cancellation when z in very close to 0
    // from Chebyshev fitting formula for erf(z) from Numerical Recipes, 6.2
    public static double erf(double z) {
        double t = 1.0 / (1.0 + 0.5 * Math.abs(z));
        // use Horner's method
        double ans = 1 - t * Math.exp( -z*z   -   1.26551223 +
				       t * ( 1.00002368 +
					     t * ( 0.37409196 + 
						   t * ( 0.09678418 + 
							 t * (-0.18628806 + 
							      t * ( 0.27886807 + 
								    t * (-1.13520398 + 
									 t * ( 1.48851587 + 
									       t * (-0.82215223 + 
										    t * ( 0.17087277))))))))));
        if (z >= 0) return  ans;
        else        return -ans;
    }


}